package main

import (
	"fmt"
	"image/color"
	"math"
)

// 标准国旗尺寸比例 (3:2)
const (
	FlagWidth  = 90 // 长宽比3:2，建议保持为3的倍数
	FlagHeight = 60
)

// 标准颜色规范 (使用中华人民共和国国家标准GB 12983-2004)
var (
	FlagRed    = color.RGBA{222, 42, 37, 255} // 国旗红
	StarYellow = color.RGBA{255, 223, 0, 255} // 五星黄
)

// 五角星位置参数 (根据国家标准)
type StarSpec struct {
	CenterX, CenterY float64 // 中心坐标 (比例坐标，0-1)
	Radius           float64 // 外接圆半径比例
	Rotation         float64 // 旋转角度 (弧度)
}

func main() {
	// 初始化画布
	canvas := createCanvas()

	// 绘制大星和四颗小星（精确数学定位）
	drawStars(canvas)

	// 输出到控制台（实际使用时建议生成图像文件）
	renderASCII(canvas)
}

func createCanvas() [][]color.RGBA {
	canvas := make([][]color.RGBA, FlagHeight)
	for y := range canvas {
		canvas[y] = make([]color.RGBA, FlagWidth)
		for x := range canvas[y] {
			canvas[y][x] = FlagRed
		}
	}
	return canvas
}

func drawStars(canvas [][]color.RGBA) {
	// 大星规格
	mainStar := StarSpec{
		CenterX:  0.25,        // 左1/4处
		CenterY:  0.4,         // 上2/5处
		Radius:   0.15,        // 外接圆直径占旗高3/10
		Rotation: math.Pi / 2, // 正立
	}

	// 小星规格 (遵循国家标准定位)
	smallStars := []StarSpec{
		{0.55, 0.2, 0.05, math.Pi},        // 右上第一星
		{0.65, 0.3, 0.05, math.Pi * 0.8},  // 右上第二星
		{0.65, 0.5, 0.05, math.Pi * 0.6},  // 右下第一星
		{0.55, 0.6, 0.05, math.Pi * 0.35}, // 右下第二星
	}

	// 绘制大星
	drawStar(canvas, mainStar, true)

	// 绘制小星
	for _, spec := range smallStars {
		drawStar(canvas, spec, false)
	}
}

func drawStar(canvas [][]color.RGBA, spec StarSpec, isMain bool) {
	// 计算实际像素坐标
	cx := int(spec.CenterX * float64(FlagWidth))
	cy := int(spec.CenterY * float64(FlagHeight))
	r := int(spec.Radius * float64(FlagHeight))

	// 五角星顶点坐标生成 (精确数学公式)
	points := make([][2]float64, 5)
	for i := 0; i < 5; i++ {
		angle := spec.Rotation + float64(i)*2*math.Pi/5
		points[i] = [2]float64{
			float64(cx) + float64(r)*math.Cos(angle),
			float64(cy) + float64(r)*math.Sin(angle),
		}
	}

	// 使用射线法进行精确填充
	for y := cy - r; y <= cy+r; y++ {
		for x := cx - r; x <= cx+r; x++ {
			if x < 0 || x >= FlagWidth || y < 0 || y >= FlagHeight {
				continue
			}
			if isPointInStar(x, y, points) {
				canvas[y][x] = StarYellow
			}
		}
	}
}

// 射线法判断点是否在五角星内
func isPointInStar(px, py int, vertices [][2]float64) bool {
	intersections := 0
	n := len(vertices)
	x, y := float64(px), float64(py)

	for i := 0; i < n; i++ {
		j := (i + 1) % n
		if rayIntersectsSegment(x, y, vertices[i], vertices[j]) {
			intersections++
		}
	}
	return intersections%2 == 1
}

func rayIntersectsSegment(x, y float64, a, b [2]float64) bool {
	if (a[1] > y) == (b[1] > y) {
		return false
	}

	t := (y - a[1]) / (b[1] - a[1])
	if t < 0 || t > 1 {
		return false
	}

	intersectX := a[0] + t*(b[0]-a[0])
	return intersectX >= x
}

// ASCII艺术渲染（实际应用建议使用图像库）
func renderASCII(canvas [][]color.RGBA) {
	for y := 0; y < FlagHeight; y++ {
		for x := 0; x < FlagWidth; x++ {
			if canvas[y][x] == StarYellow {
				fmt.Print("\033[33m★\033[0m")
			} else {
				fmt.Print("\033[41m  \033[0m")
			}
		}
		fmt.Println()
	}
}
